#include <iostream>
#include "../CImg/CImg.h"
using namespace std;
using namespace cimg_library;


#define SUPERFOR(img) for(unsigned i=0; i<img.width(); i++) for(unsigned j=0; j<img.height(); j++)

CImg<float> transf_log(CImg<float> img){
	CImg<float> copia=img;
	SUPERFOR(img){
		copia(i, j)=log(1+img(i,j));
	}
	return copia;
}

CImg<float> transf_pot(CImg<float> img, float gamma){
	CImg<float> copia=img;
	SUPERFOR(img){
		copia(i, j)=powf(img(i,j), gamma);
	}
	return copia;
}




int main(int argc, char *argv[]) {
	CImg<float> img, tlog, tpot; 
	CImgDisplay displayImagen, displayLog, displayPot;
	
	img.load("../img_test/rmn.jpg");
	tlog=transf_log(img);
	tpot=transf_pot(img, 6);
	

	displayImagen.assign(img);
	displayLog.assign(tlog, "log(1+r)");
	displayPot.assign(tpot, "r^gamma");
	
	bool dragging=false; // para saber si estamos haciendo la seleccion
	float r0=6, r=6;
	unsigned y0, y1;
	
	while(!displayImagen.is_closed() && !displayLog.is_closed() && !displayPot.is_closed()){
		displayImagen.wait_all(); // esperamos algun evento en el display
			
		if(!dragging && displayPot.button()!=0){ // empieza el drag
			y0=displayPot.mouse_y();
			dragging=true;
		}else if(dragging && displayPot.button()==0){ // termina el drag
			dragging=false;
			r0=r;
		}else if(dragging){
			r=r0+(displayPot.mouse_y()-y0);
			r/=100;
			if(r>100) r=100;
			cout<<r<<endl;
			tpot=transf_pot(img, r);
			displayPot.render(tpot);
			displayPot.paint();
		}
	}
	
	return 0;
}


